package com.example.util.rsa;

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;

/**
 * Rsa是非对称算法，他可以产生密钥对，可以用公钥加密，私钥解密，
 * 或者私钥加密，公钥解密，最大程度的保障安全性，也可以用私钥签名，
 * 公钥验证签名的正确性，防止拥有私钥的人抵赖。下面展示加解密算法和RSA签名验证。产生密钥对的类：
 * */
public class KeyGen {

	
	 public static void main(String[] args) throws Exception {  
		 // 加密的种子信息  
		 String keyInfo = "ASDFSDFNUGD__TYTY";  
		 KeyGen kg = new KeyGen();  kg.genKeys(keyInfo); }
	 
 
    

/**  * 根据keyInfo产生公钥和私钥，并且保存到pk.dat和sk.dat文件中  *  
 * * @param keyInfo  * @throws Exception  */ 
public void genKeys(String keyInfo) throws Exception {  
	KeyPairGenerator keygen = KeyPairGenerator.getInstance("RSA");  
	SecureRandom random = new SecureRandom();  
	random.setSeed(keyInfo.getBytes());  
	// 初始加密，长度为512，必须是大于512才可以的  
	keygen.initialize(512, random);  
	// 取得密钥对 
	KeyPair kp = keygen.generateKeyPair();  
	// 取得公钥  
	PublicKey publicKey = kp.getPublic(); 
	System.out.println(publicKey);  
	saveFile(publicKey, "pk.dat");  
	// 取得私钥 
	PrivateKey privateKey = kp.getPrivate();  
	saveFile(privateKey, "sk.dat"); 
	}
/**  * 保存对象到文件  *  
 * * @param obj  
 * * @param fileName  
 * * @throws Exception  */ 
private void saveFile(Object obj, String fileName) throws Exception {  
	ObjectOutputStream output = new ObjectOutputStream(   
			new FileOutputStream(fileName)); 
	output.writeObject(obj); 
	output.close(); }
}
